package br.com.sisgerenciamento.facade.locacao;

import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;

import br.com.sisgerenciamento.dao.locacao.LocacaoDAOService;
import br.com.sisgerenciamento.dto.locacao.LocacaoDTO;
import br.com.sisgerenciamento.dto.relatorio.ListagemLocacaoDTO;
import br.com.sisgerenciamento.exceptions.AlterarException;
import br.com.sisgerenciamento.exceptions.ApplicationException;
import br.com.sisgerenciamento.exceptions.InserirException;
import br.com.sisgerenciamento.facade.empresa.EmpresaFacade;
import br.com.sisgerenciamento.facade.pedido.PedidoFacade;
import br.com.sisgerenciamento.facade.usuario.UsuarioFacade;
import br.com.sisgerenciamento.model.locacao.LocacaoVO;
import br.com.sisgerenciamento.model.pedido.PedidoVO;
import br.com.sisgerenciamento.spring.ConfiguracaoSpring;
import br.com.sisgerenciamento.utilidades.BrasilUtils;

public class LocacaoFacade {
	private static LocacaoFacade locacaoFacade;
	private LocacaoDAOService dao;

	public static LocacaoFacade getInstance(){
		if(locacaoFacade == null){
			locacaoFacade =  new LocacaoFacade();
		}
		return locacaoFacade;
	}
	
	private LocacaoFacade(){
		dao = (LocacaoDAOService) ConfiguracaoSpring.SPRING_BEAN_FACTORY.getBean( "locacaoDAO" );
	}
	
	public LocacaoDTO salvar(LocacaoDTO dto){
		try {
			LocacaoVO vo = dto.getVO();
			vo = dao.inserir(vo);
			dto = dao.consultarPorCodigo(vo.getCodigo()).getDTO();
		} catch (InserirException e) {
			e.printStackTrace();
		} catch (ApplicationException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public void alterar(LocacaoDTO dto){
		try {
			LocacaoVO vo = dto.getVO();
			dao.alterar(vo);
		} catch (AlterarException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} 
	}
	
	public LocacaoDTO consultarPorCodigo(Long codigo){
		LocacaoDTO dto = new LocacaoDTO();
		try {
			LocacaoVO vo = dao.consultarPorCodigo(codigo);
			if(vo != null)
				dto = vo.getDTO();
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public ArrayList<LocacaoDTO> buscarLocacaoPorNomeCliente(String nomeCliente){
		ArrayList<LocacaoDTO> dtos = new ArrayList<LocacaoDTO>();
		try {
			dtos = dao.consultarLocacaoPorNomeCliente(nomeCliente);
			for (LocacaoDTO locacaoDTO : dtos) {
				if(locacaoDTO.getCodigoUsuario() != null){
					locacaoDTO.setUsuario(UsuarioFacade.getInstance().obterUsuarioLogado(locacaoDTO.getCodigoUsuario()));
				}
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}

	public ArrayList<LocacaoDTO> buscarLocacaoPorPedido(Long codigoPedido) {
		ArrayList<LocacaoDTO> dtos = new ArrayList<LocacaoDTO>();
		try {
			dtos = dao.consultarLocacaoPorPedido(codigoPedido);
			for (LocacaoDTO locacaoDTO : dtos) {
				if(locacaoDTO.getCodigoUsuario() != null){
					locacaoDTO.setUsuario(UsuarioFacade.getInstance().obterUsuarioLogado(locacaoDTO.getCodigoUsuario()));
				}
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}
	
	public ArrayList<LocacaoDTO> buscarLocacaoPendente() {
		ArrayList<LocacaoDTO> dtos = new ArrayList<LocacaoDTO>();
		try {
			dtos = dao.buscarLocacaoPendente();
			for (LocacaoDTO locacaoDTO : dtos) {
				if(locacaoDTO.getCodigoUsuario() != null){
					locacaoDTO.setUsuario(UsuarioFacade.getInstance().obterUsuarioLogado(locacaoDTO.getCodigoUsuario()));
				}
			}
		} catch (ApplicationException e) {
			e.printStackTrace();
		}
		return dtos;
	}
	
	public ArrayList<ListagemLocacaoDTO> montarListagemRelatorioLocacao(Integer tipoLocacao, Date dataInicial, Date dataFinal) throws ApplicationException{
		ArrayList<PedidoVO> listaPedidoVO = PedidoFacade.getInstance().buscarPedidoLocacaoPorTipoLocacaoEPeriodo(tipoLocacao, dataInicial ,dataFinal);
		ArrayList<ListagemLocacaoDTO> listagemLocacaoDTO = new ArrayList<ListagemLocacaoDTO>();
		
		for (PedidoVO vo : listaPedidoVO) {
			ListagemLocacaoDTO locacao = new ListagemLocacaoDTO();
			locacao.setCodigo(vo.getCodigo());
			locacao.setCelular(vo.getCelular());
			locacao.setCodigoPedido(vo.getCodigo());
			locacao.setDataHoraEntrega(vo.getLocacaoVO().getDataHoraEntrega());
			locacao.setDescricao(vo.getLocacaoVO().getDescricao());
			locacao.setNomeCliente(vo.getCliente().getNome());
			locacao.setStatus(tipoLocacao);
			locacao.setTelefone(vo.getTelefone());
			locacao.setEmpresa(EmpresaFacade.getInstance().getEmpresa());
			locacao.getEmpresa().setTelefone(BrasilUtils.formatarTelefoneComDDD(locacao.getEmpresa().getTelefone()));
			locacao.getEmpresa().setCelular(BrasilUtils.formatarCelularComDDD(locacao.getEmpresa().getCelular()));
			locacao.setUsuario(UsuarioFacade.getInstance().obterUsuarioLogado(vo.getUsuario().getCodigo()));
			if(tipoLocacao.intValue() ==  0){
				locacao.setTipoPesquisa("Locados");
			}else if(tipoLocacao.intValue() ==  1){
				locacao.setTipoPesquisa("Devolvidos");
			}
			listagemLocacaoDTO.add(locacao);
		}
		return listagemLocacaoDTO;
	}
	
}
